package methodCallTreeGen;

import dslProgramGen.DslExpressedMethod;

import java.util.ArrayList;
import java.util.List;

/**
 * MethodNode表示函数的类，字段contentNodeList表示函数里的内容
 * 一个函数可能包含以下内容
 * Add PR
 * TRACES PATCH 1
 * call method f()'s trace
 * TRACES PATCH 2
 * Return
 */
public class MethodNode extends Node {

    /**
     * 表示当前method包含哪些内容，主要包含两类内容，自己函数内部的trace以及调用其他函数，这两类内容按出现先后顺序排序
     */
    public List<Node> contentNodeList = new ArrayList<>();

    /**
     * 原来的methodName可能有重复，为重名的methodName重新命名，以示区分
     * 表示形式 类名___函数名  例如 Test.myFunctionReturnMethod ()LStudent;表示为 Test___myFunctionReturnMethod
     * 如果重名 Test___myFunctionReturnMethod_v1
     */
    public String newMethodName;

    /**
     * 方法用DSL语句描述
     */
    public DslExpressedMethod dslExpressedMethod;

    /**
     * 描述该函数及其调用函数的调用链，例如该函数是A，调用了B,C,D函数，B函数调用了E函数，C函数调用了F函数，D函数调用了G,H函数(E,F,G,H函数不再调用其他函数)
     * 则其函数函数调用链为 A->[B,C,D]->[E] [F] [G,H]
     */
    public StringBuilder methodCallChainStringBuilder = new StringBuilder();

    /**
     * 该methodNode的hash值，主要用于函数精简，该函数的hash值由函数本身的DSL语句和调用函数的hash值共同决定
     */
    public int methodHashCode;

    /**
     * 用于输出函数定义到文件中，如果相同的函数定义已经输出一次了，则不用再输出一次
     */
    public boolean isWriteMethodDefineToFile = false;

    /**
     * 对已经尝试生成Loop语句的函数标记，如果相同的函数已经尝试过生成Loop语句了，则不用再处理该函数
     */
    public boolean isTriedToGenLoopStatement = false;
    /**
     * 对被传递整数值Index修改的函数标记
     */
    public boolean isChangedForIndex = false;

    public MethodNode(NodeType nodeType, String methodName, Node parentNode) {
        super(nodeType, methodName, parentNode);
    }
}
